package be.ipl.finito.servlets;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import be.ipl.finito.domaine.Joueur;
import be.ipl.finito.domaine.Participation;
import be.ipl.finito.domaine.Partie;
import be.ipl.finito.exceptions.BizException;
import be.ipl.finito.usecases.GestionParties;

@SuppressWarnings("serial")
@WebServlet(name= "listerPartiesSuspendues.html")
public class ListerPartiesSuspendues extends HttpServlet implements Servlet {

	@EJB
	private GestionParties gp;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		HttpSession session = req.getSession();
		List<Partie> parties;
		Joueur j = (Joueur) session.getAttribute("joueur");
		parties = gp.listerPartiesSuspendues(j);
		Map<Partie,Set<Participation>> partiesEnCours = (Map<Partie, Set<Participation>>) getServletContext().getAttribute("parties");
		if(partiesEnCours == null)
			partiesEnCours = new HashMap<Partie,Set<Participation>>();

		for (Partie partie : partiesEnCours.keySet()) {
			
			try {
				Participation maParticipaton = gp.getParticipation(partie, j);
				if(partiesEnCours.get(partie).contains(maParticipaton)){
					parties.remove(partie);
				}
			} catch (BizException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		Map<Partie, Integer> mapParties = new HashMap<Partie, Integer>();
		for(Partie partie: parties){
			Set<Participation> parts = partiesEnCours.get(partie);
			int nbJoueur = 0;
			if(parts != null)
				nbJoueur = parts.size();
			mapParties.put(partie, nbJoueur);
		}
		req.setAttribute("mapParties", mapParties);

		req.setAttribute("parties", parties);
		req.setAttribute("titre", "Liste des parties suspendues");
		req.setAttribute("url", getServletName());
		RequestDispatcher rd = getServletContext().getNamedDispatcher(
				"ListerParties");
		rd.forward(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//TODO faire le traitement pour rejoindre la partie et passer dans Attente
		int id_partie = Integer.parseInt(req.getParameter("partie"));
		HttpSession session = req.getSession();

		Joueur joueur = (Joueur) session.getAttribute("joueur");

		Partie partie = gp.getPartieById(id_partie);
		@SuppressWarnings("unchecked")
		List<Partie> parties = (List<Partie>) session.getAttribute("parties");
		if (parties == null)
			parties = new ArrayList<Partie>();
		parties.add(partie);
		synchronized(session) {
			session.setAttribute("parties", parties);
		}
		resp.sendRedirect("jouer.html?id=" + id_partie);
	}
}